#ifndef DEBUG_OUT_H
#define DEBUG_OUT_H



#define REV_FINISH  0x01 // finish
#define REV_OK  0
#define REV_ERR  (-1)



/*
 * type:           ************size**************
--------------------------------
*p:             所占字节数：4
--------------------------------
bool:           所占字节数：1   最大值：1               最小值：0
--------------------------------
char:           所占字节数：1   最大值：127             最小值：-128
signed char:    所占字节数：1   最大值：127             最小值：-128
unsigned char:  所占字节数：1   最大值：              最小值：
--------------------------------
short:          所占字节数：2   最大值：32767           最小值：-32768
unsigned short: 所占字节数：2   最大值：65535           最小值：0
wchar_t:        所占字节数：2   最大值：65535           最小值：0
--------------------------------

--------------------------------
long:           所占字节数：4   最大值：2147483647      最小值：-2147483648
unsigned long:  所占字节数：4   最大值：4294967295      最小值：0
--------------------------------
double:         所占字节数：8   最大值：1.79769e+308    最小值：2.22507e-308
long double:    所占字节数：8   最大值：1.79769e+308    最小值：2.22507e-308
--------------------------------
float:          所占字节数：4   最大值：3.40282e+38     最小值：1.17549e-38
size_t:         所占字节数：4   最大值：4294967295      最小值：0
string:         所占字节数：28
type:           ************size**************
*/

/*
 * int:            所占字节数：4   最大值：2147483647      最小值：-2147483648
 * unsigned:       所占字节数：4   最大值：4294967295      最小值：0
 * */
typedef int            int32;
typedef unsigned int   uint32;
typedef uint32         u32;

/*
 * short:          所占字节数：2   最大值：32767           最小值：-32768
 * unsigned short: 所占字节数：2   最大值：65535           最小值：0
 * wchar_t:        所占字节数：2   最大值：65535           最小值：0
*/
typedef short          int16;
typedef unsigned short uint16;
typedef uint16          u16;
/*
 * char:           所占字节数：1   最大值： 127               最小值：-128
 * signed char:    所占字节数：1   最大值： 127               最小值：-128
 * unsigned char:  所占字节数：1   最大值： 255             最小值：0
*/
typedef char  int8;
//typedef signed char  uint8;
typedef unsigned char  uint8;
typedef     uint8      u8;


// 打印输出参考：https://blog.csdn.net/KindBitch/article/details/122443446?spm=1001.2014.3001.5506
//调试打印开关

// 参考 https://blog.csdn.net/dayancn/article/details/80021273
#define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1):__FILE__) // 只打印单文件相对路径，避免文件字符路径较长，但是会导致strrchr 多次处理延时

#define __DEBUG 1
#if __DEBUG == 1
#define GUA_LOGN              debug_out
#define GUA_LOGI(format, ...) debug_out("\033[32m%s:%d " format "", __FILE__, __LINE__, ##__VA_ARGS__)
#define GUA_LOGW(format, ...) debug_out("\033[33m%s:%d " format "", __FILE__, __LINE__, ##__VA_ARGS__)
#define GUA_LOGE(format, ...) debug_out("\033[31m%s:%d " format "", __FILE__, __LINE__, ##__VA_ARGS__)
#elif __DEBUG == 2
#define GUA_LOGI(format, ...) debug_out("\033[32m%s:%d "format"", __FILENAME__, __LINE__, ##__VA_ARGS__)
#define GUA_LOGW(format, ...) debug_out("\033[33m%s:%d "format"", __FILENAME__, __LINE__, ##__VA_ARGS__)
#define GUA_LOGE(format, ...) debug_out("\033[31m%s:%d "format"", __FILENAME__, __LINE__, ##__VA_ARGS__)
#elif __DEBUG == 3
#define GUA_LOGI(format, ...) printf("\033[32m["__FILE__" Line: %d] %s: "format"\033[32;0m\n", __LINE__, __func__, ##__VA_ARGS__)
#define GUA_LOGW(format, ...) printf("\033[33m["__FILE__" Line: %d] %s: "format"\033[32;0m\n", __LINE__, __func__, ##__VA_ARGS__)
#define GUA_LOGE(format, ...) printf("\033[31m["__FILE__" Line: %d] %s: "format"\033[32;0m\n", __LINE__, __func__, ##__VA_ARGS__)
#elif __DEBUG == 4
#define GUA_LOGI(format, ...) printf("\033[32m["__FILE__" Line: %d] "format"\033[32;0m\n", __LINE__, ##__VA_ARGS__)
#define GUA_LOGW(format, ...) printf("\033[33m["__FILE__" Line: %d] "format"\033[32;0m\n", __LINE__, ##__VA_ARGS__)
#define GUA_LOGE(format, ...) printf("\033[31m["__FILE__" Line: %d] "format"\033[32;0m\n", __LINE__, ##__VA_ARGS__)
#elif __DEBUG == 5
#define GUA_LOGI(format, ...) printf("\033[32m["__FILE__": %d] "format"\033[32;0m\r\n", __LINE__, ##__VA_ARGS__)
#define GUA_LOGW(format, ...) printf("\033[33m["__FILE__": %d] "format"\033[32;0m\r\n", __LINE__, ##__VA_ARGS__)
#define GUA_LOGE(format, ...) printf("\033[31m["__FILE__": %d] "format"\033[32;0m\r\n", __LINE__, ##__VA_ARGS__)
#else
#define GUA_LOGI(format, ...) DEBUG_ERROR("\033[32m["__FILE__": %d] "format"\033[32;0m", __LINE__, ##__VA_ARGS__)
#define GUA_LOGW(format, ...) DEBUG_ERROR("\033[33m["__FILE__": %d] "format"\033[32;0m", __LINE__, ##__VA_ARGS__)
#define GUA_LOGE(format, ...) DEBUG_ERROR("\033[31m["__FILE__": %d] "format"\033[32;0m", __LINE__, ##__VA_ARGS__)

#endif

void debug_out(const char* format, ...);

#endif

